<?php

#[('设计模式 - 多态')]

#[abstract('Tiger', '父类')]
abstract class Tiger
{
    abstract public function climb();
}

class XTiger extends Tiger
{
    public function climb()
    {
        echo "摔下来";
    }
}

class MTiger extends Tiger
{
    public function climb()
    {
        echo "爬树顶";
    }
}

class Cat
{
    public function climb()
    {
        echo "飞起来";
    }
}

# 多态
# java等语言中 参数必须指定类型 Tiger
# php中不需要指定类型,大多数设计模式都是可以自然消除的
class Client
{
    public static function call(Tiger $animal)
    {
        $animal->climb();
    }
}

Client::call(new XTiger);
Client::call(new MTiger);
Client::call(new Cat);
